from django.db import models

# 所有的权限、活动需要预先导入到数据库中去
# 黑白名单库根据已有的数据集进行构建，同时会根据判别结果实时更新

# ---------------------------------------------以下全部是有关于静态解析所获得的一些数据-------------------------------------

# 同时，前端需要展示出apk的图标，需要存储
# AndroidManifest文件解析的详细信息
class apk_AndroidmanifestAPK(models.Model):
    # 所有权限（包括危险系数以及详细说明）
    permissions = models.FileField(upload_to="permissions/", blank=True, null=True)
    # 权限列表-用以作为模型输入
    input_permissions = models.CharField(max_length=10000, blank=True, null=True)
    # 主活动
    activities = models.CharField(max_length=550, blank=True, null=True)
    # 源代码-二进制文件
    source_code = models.FileField(upload_to='AndroidManifest/', blank=True, null=True)
    # 包名
    package_name = models.CharField(max_length=50)
    # APP名字
    app_name = models.CharField(max_length=50)
    # app图标,根据地址寻图
    # 找不到允许为空
    app_icon_path = models.CharField(max_length=50, blank=True, null=True)
    app_icon = models.ImageField(blank=True, null=True, upload_to='app_icon/')
    # Android版本代码
    android_version_code = models.CharField(max_length=50)
    # Android版本名称
    android_version_name = models.CharField(max_length=50)

    class Meta:
        db_table = 'apk_AndroidmanifestAPK'

# 存储的是dex文件解析后的内容
class apk_dexInfo(models.Model):
    java_source = models.FileField(blank=True, null=True, default="java.txt", upload_to="java_source/")
    dex_image = models.ImageField(blank=True, null=True, default="dex.jpg", upload_to="dex_image/")

    class Meta:
        db_table = 'apk_dexInfo'

# 签名文件信息
class apk_signature(models.Model):
    # 应用是否签名
    is_signature = models.BooleanField(default=False, blank=True, null=True)
    # 应用是否有效
    is_valid = models.BooleanField(default=False, blank=True, null=True)
    # 签名名称
    signature_name = models.CharField(max_length=50, blank=True, null=True)
    # 发布者信息
    # 国家
    country = models.CharField(max_length=50, blank=True, null=True)
    # 省市
    province = models.CharField(max_length=50, blank=True, null=True)
    # 城市
    city = models.CharField(max_length=50, blank=True, null=True)
    # 组织
    organization = models.CharField(max_length=50, blank=True, null=True)
    # 服务器或服务名称
    serviceName = models.CharField(max_length=50, blank=True, null=True)
    # 指纹信息
    # md5值
    md5 = models.CharField(max_length=50, blank=True, null=True)
    # apk  v1.v2.v3 签名
    v1 = models.BooleanField(default=False, blank=True, null=True)
    v2 = models.BooleanField(default=False, blank=True, null=True)
    v3 = models.BooleanField(default=False, blank=True, null=True)
    # sha 1值、sha 256值、sha 512值
    sha1 = models.CharField(max_length=350, blank=True, null=True)
    sha256 = models.CharField(max_length=350, blank=True, null=True)

    class Meta:
        db_table = 'apk_signature'


# APK文件表-存储上传的所有apk文件
class apk_files(models.Model):
    data = models.FileField(upload_to='apk_file/', blank=True, null=True)
    file_name = models.CharField(max_length=50, blank=True, null=True)
    file_size = models.IntegerField(default=0, blank=True, null=True)
    create_date = models.DateTimeField(auto_now_add=True, blank=True, null=True)

    class Meta:
        db_table = 'apk_files'

class apk_related_site(models.Model):
    # 相关域名-涉及诈骗时才需要进行这一部分的解析
    # 主要是通过动态解析（使用模拟器）获取域名
    apk_DNS = models.FileField(blank=True, null=True, upload_to='apk_DNS/', default='apk_DNS.txt')
    # 相关的url，url和域名不一样，一些服务器的地址也叫做url，域名是url的一部分
    # 解析url使用的是apk2url，实现的是apk内的url获取
    apk_urls = models.FileField(blank=True, null=True, upload_to='apk_urls/', default='apk_urls.txt')

class APK_info(models.Model):
    # 签名文件信息
    signature = models.OneToOneField(apk_signature, on_delete=models.DO_NOTHING)
    # androidManifest信息
    AndroidmanifestAPK = models.OneToOneField(apk_AndroidmanifestAPK, on_delete=models.DO_NOTHING)
    # dex文件信息
    dexInfo = models.OneToOneField(apk_dexInfo, on_delete=models.DO_NOTHING)
    # apk原始文件信息
    files = models.OneToOneField(apk_files, on_delete=models.DO_NOTHING)
    # apk的相关站点信息
    related_site = models.OneToOneField(apk_related_site, on_delete=models.DO_NOTHING, blank=True, null=True)
    class Meta:
        db_table = 'APK_info'

# --------------------------------------以下是黑白名单库表的一个构建-------------------------------------------

#     黑白名单库（包名可以唯一确定一个apk文件）
class black_apk(models.Model):
    packageName = models.CharField(max_length=100, unique=True)
    apkName = models.CharField(max_length=500, blank=True, null=True)
    md5 = models.CharField(max_length=500, blank=True, null=True)
    result = models.CharField(max_length=500, blank=True, null=True)

    class Meta:
        db_table = 'black_apk'

class white_apk(models.Model):
    packageName = models.CharField(max_length=100, unique=True)
    apkName = models.CharField(max_length=500, blank=True, null=True)
    md5 = models.CharField(max_length=500, blank=True, null=True)
    result = models.CharField(max_length=500, blank=True, null=True)

    class Meta:
        db_table = 'white_apk'

# --------------------------------------以下是关于动态解析的一些数据-----------------------------------------------
